package com.ny.controller;

import com.ny.entity.Result;
import com.ny.entity.User;
import com.ny.service.UserService;
import com.ny.until.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;

/**
 * 用户控制器类，处理用户相关的HTTP请求
 */
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    // json测试：http://127.0.0.1:8083/register  POST
    // @RequestBody的意思：表示将请求体中的JSON数据映射为User对象

    /**
     * 处理用户注册请求
     * @param user 用户对象，包含注册所需的信息
     * @return 返回注册结果，成功返回成功信息，失败返回错误信息
     */
    @PostMapping("/register")
    public Result register(@RequestBody User user) {
        // 检查用户名是否已存在
        User existingUser = userService.findByUsername(user.getUsername());
        if (existingUser != null) {
            return Result.error("用户名已存在");
        }
        
        // 设置默认激活状态
        if (user.getIsActive() == null) {
            user.setIsActive(true);
        }
        
        int i = userService.addUser(user);
        if (i > 0) {
            return Result.success("注册成功");
        }
        return Result.error("注册失败");
    }

    /**
     * 处理用户登录请求
     * @param username 用户名
     * @param password 密码
     * @return 返回登录结果，成功返回用户信息和Token，失败返回错误提示
     */
    @GetMapping("/login")
    public Result login(@RequestParam String username, @RequestParam String password) {
        try {
            System.out.println("=== 开始处理登录请求 ===");
            // 添加调试信息
            System.out.println("登录请求参数：username=" + username + ", password=" + password);
            
            if (username == null || username.isEmpty()) {
                System.out.println("用户名为空");
                return Result.error("用户名不能为空");
            }
            
            if (password == null || password.isEmpty()) {
                System.out.println("密码为空");
                return Result.error("密码不能为空");
            }
            
            System.out.println("调用 userService.findUser 方法");
            User user = userService.findUser(username, password);
            System.out.println("查询到的用户：" + user);
            
            if (user != null) {
                System.out.println("用户存在，开始处理登录逻辑");
                // 检查账号是否激活
                if (!user.getIsActive()) {
                    System.out.println("账号未激活");
                    return Result.error("账号未激活");
                }
                
                // 确保用户角色不为空，设置默认角色
                if (user.getRole() == null || user.getRole().isEmpty()) {
                    // 为admin用户设置管理员角色，其他用户设置普通用户角色
                    if ("admin".equals(username)) {
                        user.setRole("ADMIN");
                    } else {
                        user.setRole("USER");
                    }
                    System.out.println("设置用户角色为: " + user.getRole());
                }
                
                System.out.println("准备生成JWT Token，参数: username=" + user.getUsername() + 
                    ", userId=" + user.getUserId() + ", role=" + user.getRole());
                
                // 生成JWT Token
                String token = JwtUtil.generateToken(user.getUsername(), user.getUserId(), user.getRole());
                System.out.println("生成的Token: " + token);
                
                // 创建安全的用户信息对象（不包含密码和盐值）
                User safeUser = new User();
                safeUser.setUserId(user.getUserId());
                safeUser.setUsername(user.getUsername());
                safeUser.setNickname(user.getNickname() != null ? user.getNickname() : "");
                safeUser.setPhone(user.getPhone() != null ? user.getPhone() : "");
                safeUser.setEmail(user.getEmail() != null ? user.getEmail() : "");
                safeUser.setRole(user.getRole());
                safeUser.setIsActive(user.getIsActive());
                safeUser.setCreatedTime(user.getCreatedTime());
                
                System.out.println("创建的安全用户信息: " + safeUser);
                
                // 返回用户信息和Token
                System.out.println("登录成功，返回用户信息和token");
                System.out.println("=== 登录处理结束 ===");
                return Result.success(new LoginResponse(safeUser, token));
            } else {
                System.out.println("用户名或密码错误");
                System.out.println("=== 登录处理结束 ===");
                return Result.error("用户名或密码错误");
            }
        } catch (Exception e) {
            // 记录异常信息
            System.err.println("登录过程中发生异常: ");
            e.printStackTrace();
            // 返回错误结果
            System.out.println("=== 登录处理结束 ===");
            return Result.error("登录失败，请重试: " + e.getMessage());
        }
    }
    
    /**
     * 登录响应类，包含用户信息和Token
     */
    private static class LoginResponse {
        private User user;
        private String token;
        
        public LoginResponse(User user, String token) {
            this.user = user;
            this.token = token;
        }
        
        public User getUser() {
            return user;
        }
        
        public void setUser(User user) {
            this.user = user;
        }
        
        public String getToken() {
            return token;
        }
        
        public void setToken(String token) {
            this.token = token;
        }
    }
    /**
     * 根据用户ID查询用户信息
     * 需要认证才能访问
     */
    @GetMapping("/user/{userId}")
    public Result findUserById(@PathVariable Integer userId) {
        User user = userService.findByUserId(userId);
        if (user != null) {
            // 隐藏敏感信息
            user.setPassword(null);
            user.setSalt(null);
            return Result.success(user);
        }
        return Result.error("用户不存在");
    }
    
    /**
     * 获取当前登录用户信息
     * 需要认证才能访问
     */
    @GetMapping("/user/info")
    public Result getCurrentUserInfo(HttpServletRequest request) {
        // 从请求中获取用户ID（由JWT拦截器设置）
        Integer userId = (Integer) request.getAttribute("userId");
        
        User user = userService.findByUserId(userId);
        if (user != null) {
            // 隐藏敏感信息
            user.setPassword(null);
            user.setSalt(null);
            return Result.success(user);
        }
        return Result.error("用户不存在");
    }
    
    @GetMapping("/findUserByEmail")
    public Result findUserByEmail(String email){
        User user = userService.findUserByEmail(email);
        if (user != null) {
            // 隐藏敏感信息
            user.setPassword(null);
            user.setSalt(null);
            return Result.success(user);
        }
        else {
            return Result.error("该邮箱不存在");
        }
    }
    @GetMapping("/sendEmail")
    public Result sendEmail(String toEmail){
        if (toEmail!=null&& userService.findUserByEmail(toEmail)!=null){
            userService.sendToEmail(toEmail);
            return  Result.success("发送成功");
        }
        return Result.error("发送失败,该QQ邮箱号不存在");
    }
    // 修改密码：http://127.0.0.1:8083/updatePassword?code=123456&password=123456&email=<EMAIL>
    @PutMapping("/updatePassword")
    public Result updatePassword(String code,String password,String email){
        // 判断验证码是否正确，如果正确，就修改密码
        if (userService.checkCode(email,code)){
            int i = userService.updatePassword(password,email);
            return Result.success("修改密码成功");
        }
        return Result.error("修改密码失败");
    }
}